home *** CD-ROM | disk | FTP | other *** search
/ PC Media 2 / PC MEDIA CD02.iso / share / udos / filtr14 / filter14.c < prev   
Encoding:
C/C++ Source or Header  |  1992-10-08  |  3.8 KB  |  142 lines

  1. /* 'filter' v. 1.4 -- Oct. 8, 1992  by Joel Polowin
  2. * Multiple-term text search utility
  3. */
  4.  
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <ctype.h>
  8. #include <string.h>
  9.  
  10. #define LENGTH 301 /* 1 more than max # characters in text lines */
  11. #define ARGS 15   /* max # search strings */
  12.  
  13. void main(argc,argv)
  14. int argc;
  15. char *argv[];
  16. {
  17.    char line[LENGTH],lowline[LENGTH];
  18.    FILE *infile;
  19.    int i,test,startarg,lowcase;
  20.    void syntax();
  21.    void strlow();
  22.    char flag[ARGS+3],orflag[ARGS+3];
  23.  
  24.    if(argc<=1 || argc>ARGS+2 || ((!(test=(*argv[1]=='+' || *argv[1]=='-' ||
  25.      *argv[1]=='_' || *argv[1]=='=' ))) && argc==2) || ((argc==ARGS+2)&&
  26.      test)) 
  27.      {
  28.      fprintf(stderr,"Bad number of strings.\n");
  29.      syntax();
  30.      }
  31.    
  32.    startarg=2;
  33.    lowcase=0;
  34.    
  35.    if(test)
  36.       {
  37.       startarg=1;
  38.       infile=stdin;
  39.       }
  40.    else if(!(infile=fopen(argv[1],"r")))
  41.       {
  42.       fprintf(stderr,"Can't open file %s for reading.\n",argv[1]);
  43.       syntax();
  44.       }
  45.  
  46.    for (i=startarg;i<argc;i++) orflag[i-1]=0;
  47.  
  48.    for (i=startarg;i<argc;i++)
  49.    {
  50.       switch(*argv[i])
  51.       {
  52.      case '+':
  53.         strlow(argv[i]);
  54.         lowcase=1;
  55.      case '=':
  56.         flag[i]=1;
  57.         break;
  58.      case '-':
  59.         strlow(argv[i]);
  60.         lowcase=1;
  61.      case '_':
  62.         flag[i]=0;
  63.         break;
  64.      case 'O':
  65.      case 'o':
  66.         orflag[i-1]=1;
  67.         argv[i]++;
  68.         i--;
  69.         break;
  70.      default:
  71.         fprintf(stderr,"Error in string no. %d: %s\n",i-1,argv[i]);
  72.         syntax();
  73.       }
  74.    }
  75.    orflag[i-1]=0;
  76.  
  77.    for (;;)
  78.       {
  79.       if(NULL==fgets(line,LENGTH,infile)) break;
  80.       if(LENGTH==strlen(line)+1) fprintf(stderr,"* Warning: truncated line \n%s\n",line);
  81.       if(lowcase) strlow(strcpy(lowline,line));
  82.       for(i=startarg;i<argc;i++)
  83.      {
  84.      test=0;
  85.      switch(*argv[i])
  86.         {
  87.         case '=':
  88.         case '_':
  89.            if(NULL!=strstr(line,(argv[i]+1))) test=1;
  90.            break;
  91.         default:
  92.            if(NULL!=strstr(lowline,(argv[i]+1))) test=1;
  93.            break;
  94.         }
  95.      if(test!=flag[i] && orflag[i]==0) break;
  96.      if(test==flag[i])
  97.         while(orflag[i]==1) i++;
  98.      }
  99.       if(i==argc) printf("%s",line);
  100.       }
  101.    if(infile!=stdin) fclose(infile);
  102. }
  103.  
  104. void strlow(string)
  105. char *string;
  106. {
  107.    while (*string!='\0')
  108.    {
  109.       *string=tolower(*string);
  110.       string++;
  111.    }
  112. }
  113.  
  114. void syntax ()
  115. {
  116.    fprintf(stderr,"Syntax: filter [filename] string1 [string2 ...]\n  where each");
  117.    fprintf(stderr," string (max. of %d) is a term to be searched for",ARGS);
  118.    fprintf(stderr," in lines (max.\n  %d chars) in file",LENGTH-1);
  119.    fprintf(stderr," `filename', prefixed by one of the following characters:\n");
  120.    fprintf(stderr,"    +  to show lines which contain string\n");
  121.    fprintf(stderr,"    -  to show lines which do not contain string\n");
  122.    fprintf(stderr,"    =  to show lines which contain string, case sensitive\n");
  123.    fprintf(stderr,"    _  (underscore) to show lines which do not contain string,\n");
  124.    fprintf(stderr,"            case sensitive\n\n");
  125.    fprintf(stderr,"A string as above may be further prefixed with the letter 'o' to\n");
  126.    fprintf(stderr,"  print the line if the current OR the preceding condition is true.");
  127.    fprintf(stderr,"\nA string including blanks and the prefix may be enclosed in");
  128.    fprintf(stderr," double quotes.\n\nExamples:\n  filter armorial =Vert +argent ");
  129.    fprintf(stderr,"-gules _Or -azure -purpur +foil > tempfile.txt\n");
  130.    fprintf(stderr,"  type temp1.txt | filter +aardvark \042o+winged pig\042 ");
  131.    fprintf(stderr,"o+wombat \042_|B|\042\n\nFilter utility v.1.4 (C) 1992 by Joel Polowin, Chem. ");
  132.    fprintf(stderr,"Dept., Queen's University,\nKingston.  Permission granted for free ");
  133.    fprintf(stderr,"use; I want credit/blame for writing it.\n");
  134.    fprintf(stderr,"polowin@silicon.chem.queensu.ca, polowinj@qucdn.queensu.ca\n");
  135.    exit(0);
  136. }
  137.  
  138.  
  139.  
  140.  
  141.        
  142.